#ifndef _EVENT_SENDER_HPP_
#define _EVENT_SENDER_HPP_

#include <EventReceiver.hpp>
#include <event_dispatch_struct.hpp>

class Event;

class EventSender
{
  // $$构造函数
public:
  EventSender();
  virtual ~EventSender();

  // $$大众接口
public:
  /**
   * 询问这个对象是否会发送事件id为_id的事件
   */
  bool   isAboutToSend( long _id );

  /**
   * 事件发生了，调用完成回调
   */
  int    eventHappen( Event& _e );

  // $$实现接口
protected:
  virtual bool   will_send( long _id );
  virtual int    send_event( Event &_e );

  // $$供EventSender调用的接口
private:
  /**
   * 应该不会用到的函数，查询发送者是否存在这样的监听
   */
  bool   has_event_dispatch_struct( long _id, EventReceiver *_recver, EventHandler _listener );

  /**
   * 往发送者的数据结构（事件处理链）中加入一个监听器，返回值表示是否成功
   */
  bool   add_event_dispatch_struct( long _id, EventReceiver *_recver, EventHandler _listener );

  /**
   * 同上，只是这次是删除
   */
  void   del_event_dispatch_struct( long _id, EventReceiver *_recver, EventHandler _listener );

  friend class EventReceiver;

  // $$内部数据结构
private:
  typedef struct{
    EventReceiver                   *listenningReceiver;
    EventHandler                    eventHandler;
  } receiver_struct;
  friend bool operator<(const receiver_struct&, const receiver_struct& );

  event_dispatch_struct<receiver_struct> *_impl;

private:
  static int  do_send_loop(void*, const receiver_struct&);
  static void do_clean_listener( void *, long, const receiver_struct& );
};

// “任意事件发送者”，通过监听它的事件，可以进行发送者的无差别监听
extern EventSender *anySender;

// “系统事件发送者”和“默认发送者”都是同一个东西，通过监听它的事件，可以监听所有的系统事件
extern EventSender *defSender, *sysSender;

#endif//_EVENT_SENDER_HPP_
